/**
 * <h3>SuggestionServiceImpl</h3>
 * <p> 建议服务实现类 </p>
 *
 * <h3>功能描述</h3>
 * <p> 实现了 {@link ISuggestionService} 接口中定义的建议信息增删改查业务逻辑 </p>
 * <p> 通过调用 {@link SuggestionMapper} 完成对数据库的操作，支持条件查询、按ID查询、更新、新增和删除等操作 </p>
 *
 * <h3>元数据</h3>
 * <ul>
 *    <li> 作者：郭强</li>
 *    <li> 创建日期：2025年05月22日 21:20:00</li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *    <li> 参考链接：<a href="https://example.com">官方网页</a></li>
 *    <li> 示例代码：{@code new SuggestionServiceImpl()} </li>
 * </ul>
 *
 * @apiNote 该类基于 MyBatis Plus 的 ServiceImpl 实现，需确保 SuggestionMapper 正确注入
 * @implSpec 继承自 {@link ServiceImpl<SuggestionMapper, Suggestion>} 并实现 {@link ISuggestionService} 接口
 * @since 1.0.0
 */

package com.dnndo.system.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dnndo.common.core.domain.entity.SysRole;
import com.dnndo.common.core.domain.entity.SysUser;
import com.dnndo.system.domain.Suggestion;
import com.dnndo.system.domain.dto.SuggestionDTO;
import com.dnndo.system.mapper.SuggestionMapper;
import com.dnndo.system.mapper.SysRoleMapper;
import com.dnndo.system.mapper.SysUserMapper;
import com.dnndo.system.service.ISuggestionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 建议服务实现类
 */
@Service
public class SuggestionServiceImpl extends ServiceImpl<SuggestionMapper, SuggestionDTO> implements ISuggestionService {

    private final SuggestionMapper suggestionMapper;

    private final SysUserMapper sysUserMapper;

    private final SysRoleMapper sysRoleMapper;



    @Autowired
    public SuggestionServiceImpl(SuggestionMapper suggestionMapper, SysUserMapper sysUserMapper, SysRoleMapper sysRoleMapper) {
        this.suggestionMapper = suggestionMapper;
        this.sysUserMapper = sysUserMapper;
        this.sysRoleMapper = sysRoleMapper;
    }

    /**
     * 查询符合条件的建议信息列表（按用户角色分支）
     * 逻辑说明：
     * 1. 校验用户ID，未登录直接抛出异常。
     * 2. 获取当前用户的角色Key集合（如admin、school、common）。
     * 3. 管理员和school角色可查询所有建议，common角色仅能查询自己提交的建议。
     * 4. 根据角色分支调用不同的Mapper方法，确保数据隔离和权限控制。
     *
     * @param suggestionDTO 查询条件，包含用户ID、学校ID等
     * @return List<Suggestion> 建议信息列表
     */
    @Override
    public List<Suggestion> selectSuggestionList(SuggestionDTO suggestionDTO) {
        // 修复：添加空值校验并获取当前登录用户ID
        String currentUserId = suggestionDTO.getUserId();
        if (currentUserId == null) {
            throw new RuntimeException("用户未登录");
        }
        suggestionDTO.setUserId(currentUserId);
        List<String> roleKeys = getUserRoleKeys(Integer.valueOf(currentUserId));
        List<Suggestion> list = new ArrayList<>();
        if (roleKeys.contains("admin")){
            // 管理员查询所有建议
            list = suggestionMapper.selectSuggestionList(suggestionDTO);
        } else if (roleKeys.contains("school")) {
            setUserSchoolId(suggestionDTO);
            // 学院查询所有建议
            list = suggestionMapper.selectSuggestionList(suggestionDTO);
        } else if (roleKeys.contains("common")) {
            // 普通用户查询自己建议
            list = suggestionMapper.selectSuggestionListByCommon(suggestionDTO);
        }
        return list;
    }

    /**
     * 获取指定用户的角色Key集合
     * 逻辑说明：
     * 1. 通过用户ID查询其所有角色。
     * 2. 提取所有角色的roleKey，返回字符串列表。
     *
     * @param userId 用户ID
     * @return List<String> 角色Key列表
     */
    private List<String> getUserRoleKeys(Integer userId) {
        List<SysRole> roles = sysRoleMapper.selectRolePermissionByUserId(userId.longValue());
        return roles.stream().map(SysRole::getRoleKey).toList();
    }

    /**
     * 设置用户所属学校ID到DTO
     * 逻辑说明：
     * 1. 通过用户ID查询用户信息。
     * 2. 将用户的schoolId赋值到DTO，便于后续按学校隔离数据。
     *
     * @param dto 建议DTO，需包含userId
     */
    private void setUserSchoolId(SuggestionDTO dto) {
        SysUser user = sysUserMapper.selectUserById(Long.valueOf(dto.getUserId()));
        dto.setSchoolId(user.getSchoolId());
    }

    /**
     * 根据建议唯一标识查询建议详细信息
     * 逻辑说明：
     * 1. 通过suggestionId查询建议详情。
     * 2. 注入当前用户ID到返回对象，便于前端权限判断。
     *
     * @param suggestionId 建议ID
     * @param id 用户ID
     * @return SuggestionDTO 建议详情
     */
    @Override
    public SuggestionDTO selectSuggestionListById(Long suggestionId,Long id) {
        SuggestionDTO dto = suggestionMapper.selectSuggestionListById(suggestionId);
        dto.setUid(id.intValue());
        return dto;
    }

    /**
     * 更新指定ID的建议信息（仅允许本人更新）
     * 逻辑说明：
     * 1. 查询要更新的建议，若不存在抛出异常。
     * 2. 增加用户ID条件，确保只能更新自己的建议。
     *
     * @param suggestionDTO 更新数据对象
     * @return int 受影响的记录数
     */
    @Override
    public int updateSuggestionById(SuggestionDTO suggestionDTO) {
        // 获取要更新的建议信息
        SuggestionDTO existing = suggestionMapper.selectSuggestionListById(Long.valueOf(suggestionDTO.getSuggestionId()));
        if (existing == null) {
            throw new RuntimeException("建议不存在");
        }
        // 增加用户ID条件确保只能更新自己的记录
        return suggestionMapper.updateSuggestionByIdWithUser(suggestionDTO);
    }

    /**
     * 新增建议信息
     * 逻辑说明：
     * 1. 插入新的建议数据，需保证suggestionDTO字段完整。
     *
     * @param suggestionDTO 建议数据对象
     * @return int 受影响的记录数
     */
    @Override
    public int insertSuggestion(SuggestionDTO suggestionDTO) {
        return suggestionMapper.insertSuggestion(suggestionDTO);
    }

    /**
     * 删除指定ID的建议信息
     * 逻辑说明：
     * 1. 根据suggestionId删除对应建议。
     *
     * @param suggestionId 建议ID
     * @return int 受影响的记录数
     */
    @Override
    public int deleteSuggestionById(Integer suggestionId) {
        return suggestionMapper.deleteSuggestionById(suggestionId);
    }

    /**
     * 查询用户自己的投诉建议
     * 逻辑说明：
     * 1. 根据userId查询该用户提交的所有建议。
     *
     * @param userId 用户ID
     * @return List<SuggestionDTO> 用户建议列表
     */
    @Override
    public List<SuggestionDTO> selectMySuggestionList(long userId) {
        return suggestionMapper.selectMySuggestionList(userId);
    }



}
